package delphorm.web.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

import delphorm.entite.personne.Utilisateur;
import delphorm.service.personne.IPersonne;
import delphorm.web.forms.AjouterUtilisateurFormulaire;

/**
 * Controller qui permet à un utilisateur de s'inscrire.<br>
 * Il travaille avec un objet de type AjouterUtilisateurFormulaire.<br>
 * Préconditions: ne pas être autentifié.<br>
 * Paramètres: aucun. Sortie:<br> - Session: <i>utilisateur</i> de classe
 * Utilisateur identifie l'utilisateur durant toute la session.<br> - Requête:
 * <i>unutilisateur</i> de classe Utilisateur permet d'afficher les données
 * dans la vue de sortie.<br>
 * 
 * @author jerome
 * @see delphorm.web.forms.AjouterUtilisateurFormulaire
 */
public class AjouterUtilisateur extends SimpleFormController {

	private IPersonne servicePersonne;
	private static final String[] ALLOWED_PROPERTIES = { "login", "password",
			"passwordConfirm", "adresseElectronique", "captcha" };

	protected void initBinder(HttpServletRequest request,
			ServletRequestDataBinder binder) throws Exception {
		super.initBinder(request, binder);
		binder.setAllowedFields(ALLOWED_PROPERTIES);
	}

	protected Object formBackingObject(HttpServletRequest request) {
		// récupère le formulaire dans la session
		Object formulaire = request.getSession().getAttribute("formulaire");

		if (formulaire == null) {
			formulaire = new AjouterUtilisateurFormulaire();
		}
		return formulaire;
	}

	public IPersonne getServicePersonne() {
		return servicePersonne;
	}

	public void setServicePersonne(IPersonne servicePersonne) {
		this.servicePersonne = servicePersonne;
	}

	/**
	 * Cette méthode enregistre les données concernant le nouvel utilisateur.
	 * Elle met l'<i>utilisateur</i> dans la session.
	 * 
	 * @return Le ModelAndView contient la vue de succès et <i>unutilisateur</i>
	 *         dans le modèle.
	 */
	protected ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, Object formulaire,
			BindException exceptions) throws Exception {

		Utilisateur utilisateur = AjouterUtilisateurFormulaire
				.newInstantanceUtilisateur((Utilisateur) formulaire);

		// effectuer l'enregistrement
		utilisateur = servicePersonne.enregistrerUtilisateur(utilisateur);

		// mettre l'utilisateur dans la session
		request.getSession().setAttribute("utilisateur", utilisateur);

		Map model = new HashMap();
		model.put("unutilisateur", utilisateur);
		return new ModelAndView(getSuccessView(), model);
	}

	protected void onBindAndValidate(HttpServletRequest request,
			Object formulaire, BindException errors) throws Exception {
		AjouterUtilisateurFormulaire formulaireU = (AjouterUtilisateurFormulaire) formulaire;

		// vérification du captcha
		/*
		 * String captcha = formulaireU.getCaptcha(); if(captcha == null)
		 * errors.rejectValue("captcha","AjouterUtilisateurFormulaire.captcha.null");
		 * if(!captcha.equals((String)request.getSession().getAttribute(nl.captcha.servlet.Constants.SIMPLE_CAPCHA_SESSION_KEY)))
		 * errors.rejectValue("captcha","AjouterUtilisateurFormulaire.captcha.invalide");
		 */
	}
}
